SpringBoot整合Mybatis |
您所在的位置:网站首页 › springboot 动态数据源 › SpringBoot整合Mybatis |
随着业务的不断扩展和复杂度的增加,我们在开发过程中往往需要访问多个数据库。比如:我们可能需要同时访问主数据库和从数据库,或者访问多个独立的数据库来处理不同的业务逻辑。这时候,我们就需要使用多数据源来实现对多个数据库的操作。 MyBatis-Plus则是一个优秀的ORM框架,它为我们封装了大量的数据库操作细节,简化了我们的开发工作,同时也提供了多数据源方案。 dynamic-datasource 开源文档付费,属于组织参与者小锅盖发起的项目。mybatis-mate 企业级付费授权,资料文档免费。今天我们以第一种方案来具体说一下怎么实现! MyBatis-Plus多数据源官网:https://baomidou.com/pages/a61e1b/#dynamic-datasource。 二、简单搭建测试1、准备工作我们先把一些使用的版本列举一下,方便大家看! Spring Boot:2.7.4dynamic-datasource:3.5.1mybatis-plus:3.5.1数据库方面这里就不演示了,我们准备好两个mysql数据库: 可以继续多种模式,咱们以简单的进行演示! # 多主多从 纯粹多库(记得设置primary) 混合配置 spring: spring: spring: datasource: datasource: datasource: dynamic: dynamic: dynamic: datasource: datasource: datasource: master_1: mysql: master: master_2: oracle: slave_1: slave_1: sqlserver: slave_2: slave_2: postgresql: oracle_1: slave_3: h2: oracle_2:4、实体类@Data public class Test { @TableId private Integer id; private String name; private Integer age; private LocalDateTime time; private LocalDateTime createdAt; }5、多数据源配置Mapper使用 @DS 切换数据源。@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。 注解 结果 没有@DS 默认数据源 @DS("dsName") dsName可以为组名也可以为具体某个库的名称 public interface TestDbMapper extends BaseMapper { }@DS("slave_1") public interface TestDb2Mapper extends BaseMapper { }注意:这里@DS可以添加在service中的方法上来切换数据源,也可以像小编一样加在Mapper接口上! 他们各有优缺点,我们需要权衡利弊进行选择: 如果一个Service只需要使用一个数据源,或者多个Service方法都需要使用相同的数据源,则建议将@DS注解添加到Mapper接口或XML文件上;如果需要根据不同的业务场景动态切换数据源,则可以选择在Service方法上使用@DS注解。 当然还有一种情况,一个service方法操作不同的数据源,表结构一样的话可以使用一个mapper。 在service内部进行切换,我们看到官方注释,「非必要不要这么使用」! // 设置当前线程数据源 如非必要不要手动调用,调用后确保最终清除 DynamicDataSourceContextHolder.push("slave_1"); // 获得当前线程数据源 DynamicDataSourceContextHolder.peek(); // 强制清空本地线程 防止内存泄漏,如手动调用了push可调用此方法确保清除 DynamicDataSourceContextHolder.poll();完整代码块: @Override public Result saveTest() { Test test = new Test(); test.setId(1993); test.setName("add方法"); // 切换指定数据源 DynamicDataSourceContextHolder.push("slave_1"); testDbMapper.insert(test); //查看当前数据源 log.info(DynamicDataSourceContextHolder.peek()); //移除数据源,恢复master数据源 DynamicDataSourceContextHolder.clear(); testDbMapper.insert(test); return Result.success("222"); }数据库展示: 我们还是以把@DS放在mapper类上来进行演示: @Autowired private TestDbMapper testDbMapper; @Autowired private TestDb2Mapper testDb2Mapper; @Override public Result saveTest() { Test test = new Test(); test.setId(1994); test.setName("add方法"); testDbMapper.insert(test); testDb2Mapper.insert(test); return Result.success("222"); }数据库正常保存到两个库,测试通过! 在使用多数据源的同时,也带来了一下事务问题,如果一个方法添加了@Transactional(rollbackFor = Exception.class)事务,默认查询只会从默认库来查询。 这个问题是要解决的,这里小编给几个思路大家可以试一下! Spring Boot提供了一个基于Atomikos的JTA实现。可以配置多个DataSourceTransactionManager进行管理事务。能分开系统来进行数据源的隔离,需要查询数据可以使用feign来获取!小编还没在企业中使用多数据源,缺乏一下关于事务方面的分享,大家有想法或者熟悉的可以留言分享一下自己的经验! 三、总结希望这篇博客能够帮助读者更好地理解和掌握Spring Boot和MyBatis-Plus多数据源的使用方法,并应用到实际项目中去。同时,也提醒读者在使用多数据源的时候要注意事项,比如事务管理、连接池配置等,以确保系统的稳定性和可靠性。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |